From 09a181d205b6d19054361b5a0d65cc877aebc191 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Mon, 9 Nov 2015 15:14:57 +0100 Subject: [PATCH] gdk: Fix invalidation w/ pixel cache when changing child window geometry. When moving/scrolling a child window we can't use the current clip region to limit what is invalidated, because there may be a pixel cache that listens for changes outside the clip region. Instead invalidate the entire area and rely on the invalidation code to limit the repaint to the actually visible area. --- gdk/gdkwindow.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 9206ead671..7e2dfb72c3 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -5761,11 +5761,16 @@ gdk_window_move_resize_internal (GdkWindow *window, if (gdk_window_is_viewable (window) && !window->input_only) { + GdkRectangle r; + expose = TRUE; - old_region = cairo_region_copy (window->clip_region); - /* Adjust regions to parent window coords */ - cairo_region_translate (old_region, window->x, window->y); + r.x = window->x; + r.y = window->y; + r.width = window->width; + r.height = window->height; + + old_region = cairo_region_create_rectangle (&r); } /* Set the new position and size */ @@ -5801,9 +5806,14 @@ gdk_window_move_resize_internal (GdkWindow *window, if (expose) { - new_region = cairo_region_copy (window->clip_region); - /* Adjust region to parent window coords */ - cairo_region_translate (new_region, window->x, window->y); + GdkRectangle r; + + r.x = window->x; + r.y = window->y; + r.width = window->width; + r.height = window->height; + + new_region = cairo_region_create_rectangle (&r); cairo_region_union (new_region, old_region); @@ -5940,7 +5950,7 @@ gdk_window_scroll (GdkWindow *window, move_native_children (window); - gdk_window_invalidate_region_full (window, window->clip_region, TRUE); + gdk_window_invalidate_rect_full (window, NULL, TRUE); _gdk_synthesize_crossing_events_for_geometry_change (window); } -- 2.30.2